package com.example.config;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.entity.Category;
import com.example.service.CategoryService;
import com.example.service.PostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import org.springframework.web.context.ServletContextAware;

import javax.servlet.ServletContext;
import java.util.List;

/**
 * ApplicationRunner接口为springboot应用程序自动后的执行特定代码的逻辑方式，该接口中有一个run方法
 *      可以初始化数据、启动定时任务、初始化缓存、启动消息队列等任务
 * @Component注解的作用：将Java类标记为spring的组件，在spring中组件是一种可以被自动扫描的和装配的类。
 *      该注解修饰后可以将该类识别为Bean对象，实例化并注册到spring容器中。上述过程都是应用程序启动时自动装配，由spring完成依赖注入
 * @Bean注解的作用：通常在配置类中手动定义Bean,需要在方法内部创建Bean实例的逻辑，并返回该实例，可以使用@Autowired等手动注入
 *
 * 两者联系：都是可以创建Bean实例   区别：前者使用范围更加广泛，后者使用更加灵活
 */

@Component
public class ContextStartup implements ApplicationRunner, ServletContextAware {

    @Autowired
    CategoryService categoryService;

    ServletContext servletContext;

    @Autowired
    PostService postService;

    @Override
    public void run(ApplicationArguments args) throws Exception {

        List<Category> categories = categoryService.list(new QueryWrapper<Category>()
                .eq("status", 0)
        );
        servletContext.setAttribute("categorys", categories);

        postService.initWeekRank();
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }
}
